/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ManagedBeans;

import ComponenteDatos.ViajeFacadeLocal;
import ComponenteEntidad.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.primefaces.event.SelectEvent;
import org.primefaces.event.UnselectEvent;

/**
 *
 * @author ANTHONY
 */
@ManagedBean
@SessionScoped
public class ManagedBeanViajes implements Serializable {

    @EJB
    private ViajeFacadeLocal ViajeFacade;
    private Viaje ObjetoViaje;
    private Viaje ObjetoViajeCrear;
    private List<Viaje> lista;
    private List<Viaje> listaViajesDisponib;
    private Agencia ObjetoAgencia;
    private Ruta ObjetoRuta;
    private Tiposervicio ObjetoTipoServicio;
    private Bus ObjetoBus;
    private Empleado ObjetoEmpleado;
    private Date horasalida;
    private Date horallegada;
    private Date fecha1;
    private Date fecha2;
    private List<SelectItem> objetoItems = new LinkedList<SelectItem>();
    private HashMap<Integer, Viaje> myobjeto = new HashMap<Integer, Viaje>();

    public ManagedBeanViajes() {
        horasalida = new Date();
        horallegada = new Date();
        fecha1 = new Date();
        fecha2 = new Date();
        ObjetoViaje = new Viaje();
        ObjetoViajeCrear = new Viaje();
        ObjetoAgencia = new Agencia();
        ObjetoRuta = new Ruta();
        ObjetoTipoServicio = new Tiposervicio();
        ObjetoBus = new Bus();
        ObjetoEmpleado = new Empleado();
        lista = new LinkedList<Viaje>();
        listaViajesDisponib = new LinkedList<Viaje>();

    }

    public List<SelectItem> getObjetoItems() throws ParseException {
        lista = new ArrayList<Viaje>();
        objetoItems = new LinkedList<SelectItem>();
        lista = ViajeFacade.findAll();
        for (Viaje p : lista) {
            if (p.getViaEstado() == true && p.getViaEstadoViaje() == 1) {
                SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy", new Locale("es", "ES"));
                myobjeto.put(p.getIdViaje(), p);
                objetoItems.add(new SelectItem(p, p.getRuta().getRutaDescripcion() + " Fecha:" + df.format(p.getViaFehaSalida()) + " Hora: " + p.getViaHoraSalida()));
            }
        }
        return objetoItems;
    }

    public List<SelectItem> getObjetoItemsviajediario() throws ParseException {//Para seleccionar solo los viajes que faltan realizar(en los combos de elegir viajes)
        lista = new ArrayList<Viaje>();
        objetoItems = new LinkedList<SelectItem>();
        lista = ViajeFacade.findAll();
        Date fechaactual = new Date();
        Date fechaviaje = new Date();
        SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
        fechaactual = df.parse(df.format(fechaactual));
//        // System.out.println("fecha actual: " + fechaactual);
        int hora, minutos, horaminviaje, horaminactual;
        Calendar calendario = new GregorianCalendar();
        hora = calendario.get(Calendar.HOUR_OF_DAY);
        minutos = calendario.get(Calendar.MINUTE);
        horaminactual = hora * 60 + minutos;
        for (Viaje p : lista) {
            if (p.getViaEstado() == true && p.getViaEstadoViaje() == 1) {
                fechaviaje = df.parse(df.format(p.getViaFehaSalida()));
//                // System.out.println("fecha viaje: " + fechaviaje);
                if (fechaviaje.after(fechaactual) || fechaviaje.equals(fechaactual)) {//muestro los viajes mayores ala fecha actual actual
//                    // System.out.println("fechaviaje mayor o igual al actual");
                    horaminviaje = Integer.parseInt(p.getViaHoraSalida().substring(0, 2)) * 60 + Integer.parseInt(p.getViaHoraSalida().substring(3, 5));
//                    // System.out.println("horaMinViaje: " + horaminviaje + " horaminactual: " + horaminactual);
////////////                    if (fechaviaje.equals(fechaactual)) {
////////////                        if (horaminviaje >= horaminactual) {//muestro los viajes mayores a la hora actual(son los que aun faltan salir)
//////////////                            // System.out.println("horaMinViaje mayor o igual alaa horaminactual");
////////////                            myobjeto.put(p.getIdViaje(), p);
////////////                            objetoItems.add(new SelectItem(p, p.getRuta().getRutaDescripcion() + " Fecha:" + df.format(p.getViaFehaSalida()) + " Hora: " + p.getViaHoraSalida()));
////////////                        }
////////////                    } else {
////////////                        myobjeto.put(p.getIdViaje(), p);
////////////                        objetoItems.add(new SelectItem(p, p.getRuta().getRutaDescripcion() + " Fecha:" + df.format(p.getViaFehaSalida()) + " Hora: " + p.getViaHoraSalida()));
////////////                    }

                    //mostramos las encomiendas del dia si queremos restringir por hora(para que no muestre si elviaje ya se paso de la hora actiual desmarcamos lo de arriva y quitams las 2 lineas de abajo abajo)
                    myobjeto.put(p.getIdViaje(), p);
                    objetoItems.add(new SelectItem(p, p.getRuta().getRutaDescripcion() + " Fecha:" + df.format(p.getViaFehaSalida()) + " Hora: " + p.getViaHoraSalida()));
                }
            }
        }
        return objetoItems;
    }

    public List<SelectItem> getObjetoItemsviajediariohhmm() throws ParseException {//Para seleccionar solo los viajes que faltan realizar(en los combos de elegir viajes)
        lista = new ArrayList<Viaje>();
        objetoItems = new LinkedList<SelectItem>();
        lista = ViajeFacade.findAll();
        Date fechaactual = new Date();
        Date fechaviaje = new Date();
        SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
        fechaactual = df.parse(df.format(fechaactual));
//        // System.out.println("fecha actual: " + fechaactual);
        int hora, minutos, horaminviaje, horaminactual;
        Calendar calendario = new GregorianCalendar();
        hora = calendario.get(Calendar.HOUR_OF_DAY);
        minutos = calendario.get(Calendar.MINUTE);
        horaminactual = hora * 60 + minutos;
        for (Viaje p : lista) {
            if (p.getViaEstado() == true && p.getViaEstadoViaje() == 1) {
                fechaviaje = df.parse(df.format(p.getViaFehaSalida()));
//                // System.out.println("fecha viaje: " + fechaviaje);
                if (fechaviaje.after(fechaactual) || fechaviaje.equals(fechaactual)) {//muestro los viajes mayores ala fecha actual actual
//                    // System.out.println("fechaviaje mayor o igual al actual");
                    horaminviaje = Integer.parseInt(p.getViaHoraSalida().substring(0, 2)) * 60 + Integer.parseInt(p.getViaHoraSalida().substring(3, 5));
//                    // System.out.println("horaMinViaje: " + horaminviaje + " horaminactual: " + horaminactual);
                    if (fechaviaje.equals(fechaactual)) {
                        if (horaminviaje >= horaminactual) {//muestro los viajes mayores a la hora actual(son los que aun faltan salir)
//                            // System.out.println("horaMinViaje mayor o igual alaa horaminactual");
                            myobjeto.put(p.getIdViaje(), p);
                            objetoItems.add(new SelectItem(p, p.getRuta().getRutaDescripcion() + " Fecha:" + df.format(p.getViaFehaSalida()) + " Hora: " + p.getViaHoraSalida()));
                        }
                    } else {
                        myobjeto.put(p.getIdViaje(), p);
                        objetoItems.add(new SelectItem(p, p.getRuta().getRutaDescripcion() + " Fecha:" + df.format(p.getViaFehaSalida()) + " Hora: " + p.getViaHoraSalida()));
                    }
                }
            }
        }
        return objetoItems;
    }

    public List<SelectItem> getObjetoItems2() throws ParseException {//Funcion para que al elegir me ponga elegir un viaje como primer item
        lista = new ArrayList<Viaje>();
        objetoItems = new LinkedList<SelectItem>();
        lista = ViajeFacade.findAll();
        Viaje q = new Viaje();
        q.setIdViaje(0);
        int aux = 1;
        Date fechaactual = new Date();
        Date fechaviaje = new Date();
        SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
        fechaactual = df.parse(df.format(fechaactual));
        fechaactual = df.parse(df.format(fechaactual));
//        // System.out.println("fecha actual: " + fechaactual);
        int hora, minutos, horaminviaje, horaminactual;
        Calendar calendario = new GregorianCalendar();
        hora = calendario.get(Calendar.HOUR_OF_DAY);
        minutos = calendario.get(Calendar.MINUTE);
        horaminactual = hora * 60 + minutos;
        for (Viaje p : lista) {
            if (p.getViaEstado() == true && p.getViaEstadoViaje() == 1) {
                fechaviaje = df.parse(df.format(p.getViaFehaSalida()));
                if (aux == 1) {
                    if (fechaviaje.after(fechaactual) || fechaviaje.equals(fechaactual)) {//muestro los viajes mayores ala fecha actual actual
//                    // System.out.println("fechaviaje mayor o igual al actual");
                        horaminviaje = Integer.parseInt(p.getViaHoraSalida().substring(0, 2)) * 60 + Integer.parseInt(p.getViaHoraSalida().substring(3, 5));
//                    // System.out.println("horaMinViaje: " + horaminviaje + " horaminactual: " + horaminactual);
////////////                        if (fechaviaje.equals(fechaactual)) {
////////////                            if (horaminviaje >= horaminactual) {//muestro los viajes mayores a la hora actual(son los que aun faltan salir)
//////////////                            // System.out.println("horaMinViaje mayor o igual alaa horaminactual");
////////////                                myobjeto.put(q.getIdViaje(), q);
////////////                                objetoItems.add(new SelectItem(q, "Seleccione un Viaje"));
////////////                                aux = 0;
////////////                            }
////////////                        } else {
////////////                            myobjeto.put(q.getIdViaje(), q);
////////////                            objetoItems.add(new SelectItem(q, "Seleccione un Viaje"));
////////////                            aux = 0;
////////////                        }

                        //muestro los viajes diarios(si queremos que no nos muestre si ya paso la hora desmarcams las lineas de arriba y quitamos las 2 lineas de abajo)
                        myobjeto.put(q.getIdViaje(), q);
                        objetoItems.add(new SelectItem(q, "Seleccione un Viaje"));
                        aux = 0;
                    }
                }
                if (fechaviaje.after(fechaactual) || fechaviaje.equals(fechaactual)) {//muestro los viajes mayores ala fecha actual actual
//                    // System.out.println("fechaviaje mayor o igual al actual");
                    horaminviaje = Integer.parseInt(p.getViaHoraSalida().substring(0, 2)) * 60 + Integer.parseInt(p.getViaHoraSalida().substring(3, 5));
//                    // System.out.println("horaMinViaje: " + horaminviaje + " horaminactual: " + horaminactual);
//////////                    if (fechaviaje.equals(fechaactual)) {
//////////                        if (horaminviaje >= horaminactual) {//muestro los viajes mayores a la hora actual(son los que aun faltan salir)
////////////                            // System.out.println("horaMinViaje mayor o igual alaa horaminactual");
//////////                            myobjeto.put(p.getIdViaje(), p);
//////////                            objetoItems.add(new SelectItem(p, p.getRuta().getRutaDescripcion() + " Fecha:" + df.format(p.getViaFehaSalida()) + " Hora: " + p.getViaHoraSalida()));
//////////                        }
//////////                    } else {
//////////                        myobjeto.put(p.getIdViaje(), p);
//////////                        objetoItems.add(new SelectItem(p, p.getRuta().getRutaDescripcion() + " Fecha:" + df.format(p.getViaFehaSalida()) + " Hora: " + p.getViaHoraSalida()));
//////////                    }

                    //muestro los viajes diarios(si queremos que no nos muestre si ya paso la hora desmarcams las lineas de arriba y quitamos las 2 lineas de abajo)
                    myobjeto.put(p.getIdViaje(), p);
                    objetoItems.add(new SelectItem(p, p.getRuta().getRutaDescripcion() + " Fecha:" + df.format(p.getViaFehaSalida()) + " Hora: " + p.getViaHoraSalida()));
                }
            }
        }
        return objetoItems;
    }

    public void setObjetoItems(List<SelectItem> objetoItems) {
        this.objetoItems = objetoItems;
    }

    public HashMap<Integer, Viaje> getMyobjeto() {
        return myobjeto;
    }

    public void setMyobjeto(HashMap<Integer, Viaje> myobjeto) {
        this.myobjeto = myobjeto;
    }

    public Viaje getObjetoViaje() {
        return ObjetoViaje;
    }

    public Viaje getObjetoViaje(int id) {
        return (Viaje) myobjeto.get(id);
    }

    public void setObjetoViaje(Viaje ObjetoViaje) {
        this.ObjetoViaje = ObjetoViaje;
    }

    public Viaje getObjetoViajeCrear() {
        return ObjetoViajeCrear;
    }

    public void setObjetoViajeCrear(Viaje ObjetoViajeCrear) {
        this.ObjetoViajeCrear = ObjetoViajeCrear;
    }

    public List<Viaje> getLista() {
        lista = new LinkedList<Viaje>();
        List<Viaje> listaTemporal = new LinkedList<Viaje>();
        listaTemporal = ViajeFacade.findAll();
        for (int i = listaTemporal.size() - 1; i >= 0; i--) {
            if (listaTemporal.get(i).getViaEstado() == true) {
                lista.add(listaTemporal.get(i));
            }
        }
        return lista;
    }

    public void setLista(List<Viaje> lista) {
        this.lista = lista;
    }

     public String FechaFormateada(Date fecha) {
        if (fecha != null) {
            StringBuilder cadena_fecha1_11 = new StringBuilder();
            SimpleDateFormat fecha1 = new SimpleDateFormat("dd/MM/yyyy");
            cadena_fecha1_11 = new StringBuilder(fecha1.format(fecha));

            return cadena_fecha1_11.toString();
        }
        return "";

    }
     
    public List<Viaje> getListaViajesDisponib() {
        listaViajesDisponib = new LinkedList<Viaje>();
        List<Viaje> listaTemporal = new LinkedList<Viaje>();
        listaTemporal = ViajeFacade.findAll();
        for (int i = listaTemporal.size() - 1; i >= 0; i--) {
            if (listaTemporal.get(i).getViaEstado() == true && listaTemporal.get(i).getViaEstadoViaje() == 1) {
                
                // vamos a validar fechas.
                 if (this.FechaFormateada(listaTemporal.get(i).getViaFehaSalida()).equals(this.FechaFormateada(new Date()))) {
                        // System.out.println("ES EL DIA, A VALIDAR");
                        //objetoVentasMostrar = listaTemporal.get(i);
                        Calendar calendario = new GregorianCalendar();
                        int hora, minutos, segundos;
                        hora = calendario.get(Calendar.HOUR_OF_DAY);
                        minutos = calendario.get(Calendar.MINUTE);
                       // // System.out.println(" veamos : " + listaTemporal.get(i).getViaje().getViaHoraSalida() + " VS " + hora + ":" + minutos);

                       // // System.out.println(" SERIA : " + listaTemporal.get(i).getViaje().getViaHoraSalida().substring(0, 2) + "y" + listaTemporal.get(i).getViaje().getViaHoraSalida().substring(3, 5) + " VS " + hora + "yy" + minutos);
                      //  // System.out.println(" finalmente : " + Integer.parseInt(listaTemporal.get(i).getViaje().getViaHoraSalida().substring(0, 2)) * 60 + "jo" + Integer.parseInt(listaTemporal.get(i).getViaje().getViaHoraSalida().substring(3, 5)) + " VS " + (hora * 60 + minutos));

                        int resultado = (Integer.parseInt(listaTemporal.get(i).getViaHoraSalida().substring(0, 2)) * 60 + Integer.parseInt(listaTemporal.get(i).getViaHoraSalida().substring(3, 5))) - (hora * 60 + minutos);
                        // System.out.println(" resultado : " + resultado);

                        //  // System.out.println(" con hora limite"+listaTemporal.get(i).);

                        // validar que sea 5 horas o el tiempo que se prgrama el viaje 300 minutos son 5 horas
                        if ((resultado+15) >=0) {
                            // System.out.println("Estos estan dentro de la hora !");

                            listaViajesDisponib.add(listaTemporal.get(i));
                          
                        } else {
                            // System.out.println("ya volaron!  ");
                             
                        }

                    } else {
                        // System.out.println("Debe Pasar solo las de fechas hacia adelante.!");
                        
                        if(listaTemporal.get(i).getViaFehaSalida().after(new Date())){
                            listaViajesDisponib.add(listaTemporal.get(i));
                        }
                         
                    }
                 
                 
                 
               
            }
        }
        return listaViajesDisponib;
    }

    public void setListaViajesDisponib(List<Viaje> listaViajesDisponib) {
        this.listaViajesDisponib = listaViajesDisponib;
    }

    public Agencia getObjetoAgencia() {
        return ObjetoAgencia;
    }

    public void setObjetoAgencia(Agencia ObjetoAgencia) {
        this.ObjetoAgencia = ObjetoAgencia;
    }

    public Ruta getObjetoRuta() {
        return ObjetoRuta;
    }

    public void setObjetoRuta(Ruta ObjetoRuta) {
        this.ObjetoRuta = ObjetoRuta;
    }

    public Tiposervicio getObjetoTipoServicio() {
        return ObjetoTipoServicio;
    }

    public void setObjetoTipoServicio(Tiposervicio ObjetoTipoServicio) {
        this.ObjetoTipoServicio = ObjetoTipoServicio;
    }

    public Bus getObjetoBus() {
        return ObjetoBus;
    }

    public void setObjetoBus(Bus ObjetoBus) {
        this.ObjetoBus = ObjetoBus;
    }

    public Empleado getObjetoEmpleado() {
        return ObjetoEmpleado;
    }

    public void setObjetoEmpleado(Empleado ObjetoEmpleado) {
        this.ObjetoEmpleado = ObjetoEmpleado;
    }

    public Date getHorasalida() {
        return horasalida;
    }

    public void setHorasalida(Date horasalida) {
        this.horasalida = horasalida;
    }

    public Date getHorallegada() {
        return horallegada;
    }

    public void setHorallegada(Date horallegada) {
        this.horallegada = horallegada;
    }

    public Date getFecha1() {
        return fecha1;
    }

    public void setFecha1(Date fecha1) {
        this.fecha1 = fecha1;
    }

    public Date getFecha2() {
        return fecha2;
    }

    public void setFecha2(Date fecha2) {
        this.fecha2 = fecha2;
    }

    public void onRowSelect(SelectEvent event) {
        FacesMessage msg = new FacesMessage("Viaje Seleccionado", ((Viaje) event.getObject()).getIdViaje().toString());
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public void onRowUnselect(UnselectEvent event) {
        FacesMessage msg = new FacesMessage("Viaje No seleccionado", ((Viaje) event.getObject()).getIdViaje().toString());

        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public void editar() {
        try {
            if (ObjetoViaje.getViaFehaSalida().after(ObjetoViaje.getViaFechaLlegada())) {
                FacesMessage msg = new FacesMessage("Informacion", "La Fecha de Llegada debe ser mayor a la Fecha de Salida");
                FacesContext.getCurrentInstance().addMessage(null, msg);
                return;
            } else {
                if (ObjetoViaje.getViaFehaSalida().equals(ObjetoViaje.getViaFechaLlegada())) {
                    double min1 = Double.parseDouble(ObjetoViaje.getViaHoraSalida().substring(0, 2));
                    double sec1 = Double.parseDouble(ObjetoViaje.getViaHoraSalida().substring(3, 5));
                    min1 = min1 + (sec1 / 60);
                    double min2 = Double.parseDouble(ObjetoViaje.getViaHoraLlegada().substring(0, 2));
                    double sec2 = Double.parseDouble(ObjetoViaje.getViaHoraLlegada().substring(3, 5));
                    min2 = min2 + (sec2 / 60);
                    if (min1 == min2 || min1 > min2) {
                        FacesMessage msg = new FacesMessage("Informacion", "La Hora de Llegada debe ser mayor a la Hora de Salida");
                        FacesContext.getCurrentInstance().addMessage(null, msg);
                        return;
                    }
                }
            }
            ViajeFacade.edit(ObjetoViaje);
            FacesMessage msg = new FacesMessage("Informacion", "El registro de Programacion de Viaje se ha Actualizado Correctamente");
            FacesContext.getCurrentInstance().addMessage(null, msg);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void eliminar() {
        try {
            ObjetoViaje.setViaEstado(false);
            ViajeFacade.edit(ObjetoViaje);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void insertar() {
        String horasalid = "", horalleg = "";
        SimpleDateFormat df = new SimpleDateFormat("HH:mm");
        if (fecha1.after(fecha2)) {
            FacesMessage msg = new FacesMessage("Informacion", "La Fecha de Llegada debe ser mayor a la Fecha de Salida");
            FacesContext.getCurrentInstance().addMessage(null, msg);
            return;
        } else {
            if (fecha1.equals(fecha2)) {
                if (horasalida.equals(horallegada) || horasalida.after(horallegada)) {
                    FacesMessage msg = new FacesMessage("Informacion", "La Hora de Llegada debe ser mayor a la Hora de Salida");
                    FacesContext.getCurrentInstance().addMessage(null, msg);
                    return;
                }
            }
        }

        if (horasalida.getHours() < 12) {
            horasalid = df.format(horasalida) + " AM";
//            if (horasalida.getHours() < 10) {
//                horasalid = "0" + horasalid;
//            }
        } else {
            horasalid = df.format(horasalida) + " PM";
        }
        if (horallegada.getHours() < 12) {
            horalleg = df.format(horallegada) + " AM";
//            if (horallegada.getHours() < 10) {
//                horalleg = "0" + horalleg;
//            }
        } else {
            horalleg = df.format(horallegada) + " PM";
        }
        
        // System.out.println("horas salida: "+horasalid);
        // System.out.println("horas salida: "+horalleg);

        try {
            // System.out.println(ObjetoViajeCrear.getBus());
//            if (!verificarSiexiste(objetoPaisCrear.getPaisPais())) {
            ObjetoViajeCrear.setViaEstado(Boolean.TRUE);
            ObjetoViajeCrear.setViaEstadoViaje(1);
            ObjetoViajeCrear.setViaFehaSalida(fecha1);
            ObjetoViajeCrear.setViaFechaLlegada(fecha2);
            ObjetoViajeCrear.setViaHoraSalida(horasalid);
            ObjetoViajeCrear.setViaHoraLlegada(horalleg);
            ObjetoViajeCrear.setViaNominacionPrecio("SN");
            ViajeFacade.create(ObjetoViajeCrear);
            ObjetoViajeCrear = new Viaje();
            FacesMessage msg = new FacesMessage("Informacion", "El registro de Programacion de Viaje se ha Guardado Correctamente");
            FacesContext.getCurrentInstance().addMessage(null, msg);
//            }else{
//                FacesMessage msg = new FacesMessage("Informacion", "Ya Existe Pais");
//                FacesContext.getCurrentInstance().addMessage(null, msg);
//            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
